package com.scs.application.modules.wm.mapper;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.scs.application.core.mapper.IBaseMapper;
import com.scs.application.modules.base.entity.Matr;
import com.scs.application.modules.dept.entity.ApplyAuto;
import com.scs.application.modules.device.entity.DeviceLedger;
import com.scs.application.modules.wm.dto.*;
import com.scs.application.modules.wm.entity.Stock;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * <p>
 * 库存 Mapper 接口
 * </p>
 */
public interface StockMapper extends IBaseMapper<Stock> {
    Double getAvailableStockVirtual(@Param("warehouseId") String warehouseId, @Param("materialId") String materialId);
    Double getAvailableStockLot(@Param("warehouseId") String warehouseId, @Param("materialId") String materialId);
    List<Stock> getFreeStockLot(@Param("warehouseId") String warehouseId, @Param("materialId") String materialId, @Param("lot") String lot);
    List<Stock> getStockByWoId(@Param("workOrderId") String workOrderId);
    List<DailyFsdKey> getFsdStockStatus(@Param("warehouseId") String warehouseId);

    List<StockDTO> getStockWarning();

    List<StockDTO> getStockDate();

    List<Stock> getStockExpDate();

    HisStockDTO getStockByUniqueCode(@Param(Constants.WRAPPER) QueryWrapper<Stock> wrapper);

    List<StockDTO> list(@Param(Constants.WRAPPER) QueryWrapper<Stock> wrapper);

    List<realTimeDTO> getRealTimeStock();

    /**
     * 选择时 分页查询
     * @param page
     * @param wrapper
     * @param params 真实参数
     * @return
     */
    Page<?> pageForDemand(IPage page, @Param(Constants.WRAPPER) QueryWrapper<Matr> wrapper, @Param("params") Map<String,Object> params, @Param("userParam") Map<String,Object> userParam);

    /**
    * @Description： 获取所有添加 fsd_tcb_stock 的库存记录
    */
    List<Stock> getTcbstockInsertList();

    Page<?> pageForStockCheck(IPage page, @Param(Constants.WRAPPER) QueryWrapper<Stock> wrapper, @Param("userParam") Map<String, Object> userParam);

    /**
    * 查询list所有数据
    * */
    List<Stock> stockList();


    Page<?> pageForPrint(IPage page, @Param(Constants.WRAPPER) QueryWrapper<Stock> wrapper);


    /*科室退货批量选择*/
    Page<?> pageDeptReturn(IPage page, @Param(Constants.WRAPPER) QueryWrapper<Stock> wrapper, @Param("userParam") Map<String, Object> userParam);


    /**
     * 获取数据列表 库存差异维护
     * @param page
     * @param wrapper
     * @param params 真实参数
     * @return
     */
    Page<Stock> pageForStockDiff(IPage page, @Param(Constants.WRAPPER) QueryWrapper<Matr> wrapper, @Param("params") Map<String,Object> params, @Param("userParam") Map<String,Object> userParam);



    /**
     * @Description： 查询库存，同时也查询0库存表，一般用于科室退货、供应商退货、his退费、科室冲红等反向添加库存业务
     * @param queryWrapper 查询条件
     * @param userParam     特殊条件，预留
     */
    List<Stock> listStockWithZero(@Param(Constants.WRAPPER) QueryWrapper<Stock> queryWrapper, @Param("userParam") Map<String,Object> userParam);



    /**
     * 获取数据列表 库存差异维护
     * @param page
     * @param wrapper
     * @param params 真实参数
     * @return
     */
    Page<Stock> pageStockWithZero(IPage page, @Param(Constants.WRAPPER) QueryWrapper<Matr> wrapper, @Param("params") Map<String,Object> params, @Param("userParam") Map<String,Object> userParam);


    /**
     * @Description： 检索拣货明细可用库存
     */
    List<StockDTO> getStockForPickItem(@Param("params") Map<String,Object> params);

    List<StockDTO> selectUnitSum(@Param("matrId") String matrId);


    //将某一个仓库下的库存分组显示
    List<StockGroupWarehouseMatrDTO> getListGroupByMatr(@Param(Constants.WRAPPER) QueryWrapper<Stock> wrapper,@Param("wrapperApplyAuto") QueryWrapper<ApplyAuto> wrapperApplyAuto);

    //获取需要推送给HIS的库存
    List<StockHisPushDTO> getListForHisPush();

    /**
     * 分页查询-选择使用
     * @return
     */
    Page<DeviceLedger> pageSelect(IPage page, @Param(Constants.WRAPPER) QueryWrapper<Stock> wrapper, @Param("params") Map<String,Object> params);

}
